import { DateLib } from "../classes/DateLib.js";
import { enUS } from "../locale/en-US.js";
import { fr } from "../locale/fr.js";
import { it } from "../locale/it.js";
import { ja } from "../locale/ja.js";

import { getLabels } from "./getLabels.js";

describe("getLabels", () => {
  test("uses locale string labels when custom labels are not provided", () => {
    const dateLib = new DateLib({
      locale: {
        ...enUS,
        labels: { labelPrevious: "Indietro" },
      },
    });

    const labels = getLabels(undefined, dateLib.options);

    expect(labels.labelPrevious(new Date())).toBe("Indietro");
  });

  test("uses locale label functions when available", () => {
    const dateLib = new DateLib({
      locale: {
        ...enUS,
        labels: {
          labelWeekday: (date) => `weekday-${date.getDay()}`,
        },
      },
    });

    const labels = getLabels(undefined, dateLib.options);

    expect(labels.labelWeekday(new Date(2024, 0, 1))).toBe("weekday-1");
  });

  test("custom labels override locale labels", () => {
    const custom = { labelNext: () => "custom-next" };
    const labels = getLabels(custom, new DateLib({ locale: ja }).options);

    expect(labels.labelNext(new Date())).toBe("custom-next");
  });

  test("falls back to defaults when locale does not define a label", () => {
    const locale = { ...enUS, labels: {} };
    const labels = getLabels(undefined, new DateLib({ locale }).options);

    expect(labels.labelWeekNumber(1)).toBe("Week 1");
  });

  test("uses Italian locale label translations", () => {
    const dateLib = new DateLib({ locale: it });
    const labels = getLabels(undefined, dateLib.options);

    expect(labels.labelPrevious(new Date())).toBe("Vai al mese precedente");
    expect(labels.labelMonthDropdown()).toBe("Scegli il mese");
    expect(labels.labelWeekNumber(3)).toBe("Settimana 3");
    expect(labels.labelYearDropdown()).toBe("Scegli l’anno");
  });

  test("uses French locale label translations", () => {
    const dateLib = new DateLib({ locale: fr });
    const labels = getLabels(undefined, dateLib.options);

    expect(labels.labelPrevious(new Date())).toBe("Aller au mois précédent");
    expect(labels.labelMonthDropdown()).toBe("Choisir le mois");
    expect(labels.labelWeekNumber(2)).toBe("Semaine 2");
    expect(labels.labelYearDropdown()).toBe("Choisir l'année");
  });
});
